package cn.jsj.onclock.service;

import cn.jsj.onclock.aop.PageNum;
import cn.jsj.onclock.aop.PageSize;
import cn.jsj.onclock.aop.PrimaryKeyParam;
import cn.jsj.onclock.pojo.SignEnt;
import cn.jsj.onclock.pojo.TaskEnt;
import cn.jsj.onclock.pojo.identity.UserIdentityEnum;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import org.springframework.validation.annotation.Validated;

import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import java.util.Date;
import java.util.List;

/**
 * @author 卢斌
 */
@Validated
public interface SignService {

    /**
     * 群相关负责人主动发起一次签到
     *
     * @param creatorId     签到发起者
     * @param aimGroupId    发起群组
     * @param startTime     签到开始时间
     * @param limitTime     签到截止时间
     * @param title         签到标题
     * @param labelId       绑定的签到标签Id
     * @param userIdList    签到用户Id列表
     * @return  签到信息实体Id
     */
    Long addOneSign(@PrimaryKeyParam Long creatorId, @PrimaryKeyParam Long aimGroupId, @NotNull Date startTime, @NotNull Date limitTime, @NotBlank@Length(max = 40) String title, @PrimaryKeyParam Long labelId, @NotNull@Size(min = 1) List<Long> userIdList);


    /**
     * 查询用户发起的签到列表（详细）
     *
     * @param userId    用户Id
     * @param pageNum   页码号
     * @param pageSize  页容量
     * @return  用户发起的签到列表
     */
    List<SignEnt> listSignEntOfIssuedFromUser(@PrimaryKeyParam Long userId, @PageNum Integer pageNum, @PageSize Integer pageSize);


    /**
     * 查询用户相关的签到任务实体（详细）
     *
     * @param userId   用户Id
     * @param pageNum  页码号
     * @param pageSize 页容量
     * @return 用户相关的签到任务实体
     */
    List<TaskEnt> listExecutorTask(@PrimaryKeyParam Long userId, @PageNum Integer pageNum, @PageSize Integer pageSize);


    /**
     * 用户查看自己发起的某一次签到的完成进度（用户仅仅可以看到自己发起的签到，管理员身份也可以查看别人的签到）
     *
     * @param userId        用户Id
     * @param userIdentity  用户身份
     * @param signId        用户要查看的签到Id
     * @return  某一签到的完成进度
     */
    List<TaskEnt> listSignFinishProgress(@PrimaryKeyParam Long userId, @NotNull UserIdentityEnum userIdentity, @PrimaryKeyParam Long signId);


    /**
     * 查询某一签到者在特定的几个签到中的完成情况
     *
     * @param userId        请求者
     * @param executorId    被调查者
     * @param signIdList    签到ID列表
     * @param userIdentity  用户身份权限
     * @return  某一签到者在特定的几个签到中的完成情况
     */
    List<TaskEnt> listExecutorFinishProgressInSpecialSign(@PrimaryKeyParam Long userId, @PrimaryKeyParam Long executorId, @NotNull@Size(min = 1) List<Long> signIdList, @NotNull UserIdentityEnum userIdentity);



    /**
     * 查询用户在某一群组中的发起签到记录
     *
     * @param userId    用户Id
     * @param groupId   查询的群组Id
     * @param from      开始时间
     * @param until     截止时间（默认是现在）
     * @param pageNum   页码号
     * @param pageSize  页容量
     * @return  查询发起的签到记录
     */
    List<SignEnt> listSignRecord(@PrimaryKeyParam Long userId, @PrimaryKeyParam Long groupId, @NotNull Date from, Date until, @PageNum Integer pageNum, @PageSize Integer pageSize);


    /**
     * 群组内部分人员的签到信息Excel表格导出
     *
     * @param userId            用户Id
     * @param userIdentityEnum  用户身份
     * @param groupId           群组Id
     * @param executorIdList    签到者Id列表
     * @param signIdList        签到Id列表
     * @param response          HttpServletResponse
     */
    void clockRecordOutPutExcel(@PrimaryKeyParam Long userId, @NotNull UserIdentityEnum userIdentityEnum, @PrimaryKeyParam Long groupId, @NotNull@Size(min = 1, max = 20000) List<Long> executorIdList, @NotNull@Size(min = 1, max = 130) List<Long> signIdList, HttpServletResponse response);


}
